package com.xinchao.service;

import com.github.pagehelper.Page;
import com.xinchao.core.constant.DeviceSettingType;
import com.xinchao.core.exception.ServiceException;
import com.xinchao.model.Area;
import com.xinchao.model.DeviceSetting;
import com.xinchao.model.User;
import com.xinchao.model.dto.DeviceInfoListDTO;
import com.xinchao.model.dto.UpdateDeviceDetailDTO;
import com.xinchao.model.page.PageInfo;
import com.xinchao.model.vo.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @ClassName DeviceInfoService
 * @Description 终端管理Service
 * @Author HanQinrui
 * @Date 2018/8/7 14:11
 * @Version 1.0
 */
public interface DeviceInfoService {

    /**
     * 获取终端管理分页列表
     * hanqr 2017-08-07
     *
     * @param cityName      当前登录城市名称
     * @param machineNumber 机器码
     * @param propertyName  物业名称
     * @param deviceMac     设备mac
     * @param deviceIp      设备IP
     * @param administrator 管理人员
     * @param district      区/县
     * @param onlineStatus  在线状态（0.在线; 1.离线）
     * @param deviceStatus  设备状态:（0:可售  1:预拆除  2:维护）
     * @param pageNum       当前页码
     * @param pageSize      每页条数
     * @return
     */
    PageInfo<DeviceInfoListDTO> listByPage(String cityName, String machineNumber, String propertyName, String deviceMac,
                                           String deviceIp, String administrator, String district, Integer onlineStatus, Integer deviceStatus, String apkVersion, String firmwareVersion,
                                           Integer pageNum, Integer pageSize);

    /**
     * 远程关机指令
     * hanqr 2018-08-10
     *
     * @param DeviceCodes 终端唯一编码
     * @param user        当前登陆用户
     * @param ip          操作Ip
     * @throws ServiceException
     */
    void shutdown(String DeviceCodes, User user, String ip) throws ServiceException;

    /**
     * 远程重启终端
     * hanqr 2018-08-10
     *
     * @param deviceCodes 终端唯一编码
     * @param user        当前登陆用户
     * @param ip          操作Ip
     * @throws ServiceException
     */
    void restart(String deviceCodes, User user, String ip) throws ServiceException;

    /**
     * 设置定时开关机
     * hanqr 2018-08-13
     *
     * @param deviceCodes 终端唯一编码
     * @param user        当前登陆用户
     * @param ip          操作Ip
     * @param bootTime    开机时间
     * @param offTime     关机时间
     * @throws ServiceException
     */
    void setBootAndOffTimmer(String deviceCodes, User user, String ip, String bootTime, String offTime) throws ServiceException;

    /**
     * 设置音量
     * hanqr 2018-08-13
     *
     * @param deviceCodes 终端唯一编码
     * @param user        当前登陆用户
     * @param ip          操作Ip
     * @param vol         音量
     * @throws ServiceException
     */
    void setVolume(String deviceCodes, User user, String ip, Integer vol) throws ServiceException;

    /**
     * 终端设置信息同步到数据库
     *
     * @param setting  设置信息
     * @param codeList 终端唯一编码list
     * @return
     */
    void updateDeviceSetting(DeviceSetting setting, List<String> codeList);

    /**
     * 将终端最新状态或设置更新到缓存
     * hanqr 2018-08-10
     *
     * @param settingType 设置类型
     * @param codeList    终端唯一编码list
     * @param serialNo    批次号，唯一且有意义。（如：时间戳）
     */
    void flushDeviceStateCache(DeviceSettingType settingType, List<String> codeList, Long serialNo);

    /**
     * 根据城市编码查询所有行政区域
     * hanqr 2018-08-07
     *
     * @param cityCode 城市编码
     * @return
     */
    List<Area> getDistrictByCityCode(String cityCode);

    /**
     * 获取终端详情
     *
     * @param deviceId 终端ID
     * @return DeviceDetailVO
     * @author linqiang
     */
    DeviceDetailVO getDeviceDetail(Long deviceId);

    /**
     * 修改终端信息
     *
     * @param deviceDetail 修改的终端信息
     * @param request      请求
     */
    void updateDevice(UpdateDeviceDetailDTO deviceDetail, HttpServletRequest request);

    /**
     * 导出终端管理列表
     * hanqr 2018-08-08
     *
     * @param cityName      当前登录城市名称
     * @param machineNumber 机器码
     * @param propertyName  物业名称
     * @param deviceMac     设备mac
     * @param deviceIp      设备IP
     * @param administrator 管理人员
     * @param district      区/县
     * @param onlineStatus  在线状态（0.在线; 1.离线）
     * @param deviceStatus  设备状态:（0:可售  1:预拆除  2:维护）
     * @return
     */
    List<DeviceInfoExportListVO> listExportDevice(String cityName, String machineNumber, String propertyName, String deviceMac, String deviceIp, String administrator, String district, Integer onlineStatus, Integer deviceStatus,String softwareVersion,String firmwareVersion);

    /**
     * 统计终端数量
     *
     * @param currentCity 当前城市
     * @return 终端统计结果类
     * @author linqiang
     */
    DeviceCountVO countByCity(String currentCity);

    /**
     * 查询终端日志分页列表
     * hanqr 2018-08-09
     *
     * @param deviceCode 机器编码
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @param logType    日志类型 crash:崩溃日志, run:运行日志, play:播放日志
     * @param pageNum    当前页
     * @param pageSize   每页条数
     * @return
     */
    Page<DeviceLogListVO> listDeviceLogs(String deviceCode, String startTime, String endTime, String logType, Integer pageNum, Integer pageSize);

    /**
     * 终端管理授权
     * hanqr 2018-08-09
     *
     * @param deviceCodes  终端编码(多个编码之间用逗号隔开)
     * @param administrans 授权人id(多个id之间用逗号隔开)
     * @param user         当前登录用户
     * @param request
     */
    void deviceAuthority(String deviceCodes, String administrans, User user, HttpServletRequest request);

    /**
     * 查询所有终端中所有的固件版本
     *
     * @return List<String>
     */
    List<String> listAllFirmwareVersion();

    /**
     * 终端升级分页筛选查询终端
     *
     * @param cityName     当前登录城市名称
     * @param softVer      软件版本
     * @param firmVer      固件版本
     * @param onlineStatus 在线状态(0:在线 1:离线)
     * @param upgradeType  更新类型(0:APK 1:固件)
     * @param deviceModel  机型
     * @param district     行政区
     * @param pageNum
     * @param pageSize
     * @return PageInfo<UpgradeDeviceListVO>
     */
    PageInfo<UpgradeDeviceListVO> listUpgradeDeviceByPage(String cityName, String softVer, String firmVer, Integer onlineStatus, Integer upgradeType,
                                                          String deviceModel, String district, Integer pageNum, Integer pageSize);

    /**
     * 条件查询终端统计符合条件的终端数量
     *
     * @param cityCode      当前登录城市编码
     * @param onlineStatus  在线状态（在线OR离线）
     * @param softVer       软件版本
     * @param firmVer       固件版本
     * @param deviceModel   机型
     * @param machineNumber 机器码
     * @param propertyName  物业名称
     * @param deviceMac     设备mac
     * @param deviceIp      设备IP
     * @param administrator 管理人员
     * @param district      区/县
     * @param deviceStatus  设备状态:（0:可售  1:预拆除  2:维护）
     * @return Long
     */
    Long getDeviceCountByCondition(String cityCode, Integer onlineStatus, String softVer, String firmVer, String deviceModel,
                                   String machineNumber, String propertyName, String deviceMac,
                                   String deviceIp, String administrator, String district, Integer deviceStatus);

    /**
     * 查询所有终端中所有的mips版本号
     * hanqr 2018-08-14
     *
     * @return
     */
    List<String> listAllSoftwareVersion();

    /**
     * 测速指令
     *
     * @param deviceCodes
     * @param user
     * @param remortIP
     * @throws ServiceException
     */
    void testNetworkSpeed(String deviceCodes, User user, String remortIP) throws ServiceException;
}
